home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / wildcat / wc2pc091.zip / WC2PCB.PAS < prev   
Pascal/Delphi Source File  |  1996-04-13  |  5KB  |  187 lines

  1. {$M 8192,0,0}
  2. {$N-,E- no math support needed}
  3. {$X- function calls may not be discarded}
  4. {$I- disable I/O checking (trap errors by checking IOResult)}
  5.  
  6. PROGRAM Convert_Wildcat_file_lists_to_PCBoard_format;
  7. USES DOS;
  8. VAR
  9.   SavedExitProc: POINTER;  { CustomExit proc inserted into normal exit. }
  10.   inFile, outFile : TEXT;
  11.  
  12. PROCEDURE NewLine; FORWARD;
  13. PROCEDURE WriteStr (CONST s: STRING); FORWARD;
  14. FUNCTION WordToHex (W: WORD): STRING; FORWARD;
  15.  
  16. PROCEDURE CustomExit; FAR; {---- Always exit through here ----}
  17. CONST
  18.   NL = #13#10;
  19. VAR
  20.   message: STRING [79];
  21. BEGIN
  22.   ExitProc := SavedExitProc;
  23.   IF (ExitCode > 0) THEN BEGIN
  24.     NewLine;
  25.     WriteStr ('wc2PCB v0.91ß - Free DOS utility: Convert Wildcat file lists to PCBoard format.');
  26.     WriteStr ('April 13, 1996. Copyright (c) 1996 by David Daniel Anderson - Reign Ware.' + NL);
  27.     WriteStr ('Usage    :  wc2PCB  <inFile>  <outFile>'+ NL);
  28.     WriteStr ('Example  :  wc2PCB  allfiles.lst  allfiles.pcb');
  29.   END;
  30.   IF ErrorAddr <> NIL THEN
  31.   BEGIN
  32.     WriteStr ('An unanticipated error occurred, please contact DDA with the following data:');
  33.     WriteLn ('Address = ', WordToHex (Seg (ErrorAddr^)), ':', WordToHex (Ofs (ErrorAddr^)));
  34.     WriteLn ('Code    = ', ExitCode);
  35.     ErrorAddr := NIL;
  36.   END
  37.   ELSE
  38.     IF (ExitCode IN [1..254]) THEN BEGIN
  39.       CASE ExitCode OF
  40.         7 : message := 'File handling error.  Make sure you specified "inFile" and "outFile" properly.';
  41.         ELSE  message := 'Unknown error.';
  42.       END;
  43.       WriteLn ('Error encountered (#', ExitCode, '):'); WriteStr (message);
  44.     END;
  45. END;
  46.  
  47. PROCEDURE CheckIO; { Check IOResult, exit on error. }
  48. BEGIN
  49.   IF IOResult <> 0 THEN Halt (7);
  50. END;
  51.  
  52. PROCEDURE NewLine;
  53. BEGIN
  54.   WriteLn;
  55. END;
  56.  
  57. PROCEDURE WriteStr (CONST s: STRING);
  58. BEGIN
  59.   WriteLn (s);
  60. END;
  61.  
  62. CONST
  63.   HexDigits : ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
  64.  
  65. FUNCTION ByteToHex (B: BYTE): STRING; {Convert a BYTE var to Hex string}
  66. BEGIN
  67.   ByteToHex := Concat (HexDigits [B SHR 4], HexDigits [B AND $F]);
  68. END;
  69.  
  70. FUNCTION WordToHex (W: WORD): STRING; {Convert a WORD var to Hex string}
  71. BEGIN
  72.   WordToHex := ByteToHex (Hi (W)) + ByteToHex (Lo (W));
  73. END;
  74.  
  75. PROCEDURE OpenFiles;
  76. VAR
  77.   vErr: INTEGER;
  78. BEGIN
  79.   IF ParamCount <> 2 THEN Halt (255);
  80.  
  81.   Assign (inFile, ParamStr (1));
  82.   Reset (inFile); CheckIO;
  83.  
  84.   Assign (outFile, ParamStr (2));
  85.   Rewrite (outFile); CheckIO;
  86.  
  87.   Write ('Converting ' + ParamStr (1) + ' to ' + ParamStr (2));
  88. END;
  89.  
  90. FUNCTION RTrim (InStr: STRING): STRING;
  91. BEGIN
  92.   WHILE (Length (InStr) > 0) AND (InStr [Length (InStr)] IN [#0, #9, #32]) DO
  93.     Dec (InStr [0]);
  94.   RTrim := InStr;
  95. END;
  96.  
  97. FUNCTION LTrim (InStr: STRING): STRING;
  98. BEGIN
  99.   WHILE (Length (InStr) > 0) AND (InStr [1] IN [#0, #9, #32]) DO
  100.     Delete (InStr, 1, 1);
  101.   LTrim := InStr;
  102. END;
  103.  
  104. FUNCTION Trim (InStr: STRING): STRING;
  105. BEGIN
  106.   Trim := RTrim (LTrim (InStr));
  107. END;
  108.  
  109. FUNCTION IsFirstLine (aLine: STRING): BOOLEAN;
  110. VAR
  111.   First: BOOLEAN;
  112.   fSizeStr: STRING;
  113.   fSize, vErr: INTEGER;
  114.  
  115. BEGIN
  116.   First := FALSE;
  117.  
  118.   IF (Length (aLine) >= 34) AND
  119.      (NOT (aLine [1] IN [' ', '*', '.', '?'])) AND
  120.      (Copy (aLine, 22, 3) = '   ') AND
  121.      (Copy (aLine, 33, 2) = ' |') AND
  122.      (aLine [27] = '/') AND (aLine [30] = '/')
  123.   THEN BEGIN
  124.     fSizeStr := Trim (Copy (aLine, 19, 3));
  125.     Val (fSizeStr, fSize, vErr);
  126.     IF (vErr = 0) AND (fSize >= 0) AND (fSize <= 999)
  127.       THEN First := TRUE;
  128.   END;
  129.   IsFirstLine := First;
  130. END;
  131.  
  132. VAR
  133.   CurrLine: STRING;
  134.   Written,
  135.   EndOfDesc: BOOLEAN;
  136.  
  137. BEGIN
  138.   SavedExitProc := ExitProc;
  139.   ExitProc := @CustomExit;  { Insert custom exit procedure. }
  140.  
  141.   OpenFiles;
  142.   WHILE NOT EoF (inFile) DO
  143.   BEGIN
  144.     ReadLn (inFile, CurrLine);
  145.     CurrLine := RTrim (CurrLine);
  146.     Written := FALSE;
  147.     IF IsFirstLine (CurrLine) THEN
  148.     BEGIN
  149.       CurrLine := Copy (CurrLine, 1, 12) + #32#32 +  { File name }
  150.                   Copy (CurrLine, 13, 1) +           { File size }
  151.                   Copy (CurrLine, 15, 3) +
  152.                   Copy (CurrLine, 19, 3) + #32#32 +
  153.                   Copy (CurrLine, 25, 2) + #45 +     { File date }
  154.                   Copy (CurrLine, 28, 2) + #45 +
  155.                   Copy (CurrLine, 31, 2) + #32#32 +
  156.                   Copy (CurrLine, 36, Length (CurrLine) - 35); { File desc }
  157.  
  158.       WriteLn (outFile, RTrim (CurrLine));
  159.  
  160.       EndOfDesc := FALSE;
  161.       WHILE (NOT EndOfDesc) AND (NOT EoF (inFile)) DO
  162.       BEGIN
  163.         ReadLn (inFile, CurrLine);
  164.         CurrLine := RTrim (CurrLine);
  165.         Written := FALSE;
  166.         IF (Copy (CurrLine, 33, 2) <> ' |') THEN
  167.           EndOfDesc := TRUE
  168.         ELSE BEGIN
  169.           CurrLine := Copy (CurrLine, 36, Length (CurrLine) - 35);
  170.           IF (CurrLine <> '') THEN WriteLn (outFile, '': 33, CurrLine);
  171.           Written := TRUE;
  172.         END;
  173.       END;
  174.     END;
  175.     IF (NOT Written) AND (CurrLine <> '') THEN
  176.     BEGIN
  177.       IF Copy (CurrLine, 1, 6) = '**** [' THEN WriteLn (outFile);
  178.       WriteLn (outFile, CurrLine);
  179.       IF Copy (CurrLine, 1, 6) = '**** [' THEN WriteLn (outFile);
  180.     END;
  181.   END;
  182.  
  183.   Close (InFile);
  184.   Close (OutFile);
  185.   WriteStr (', done!');
  186. END.
  187.